home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / prefs / prefsgui.pyo (.txt) < prev   
Python Compiled Bytecode  |  2008-10-13  |  11KB  |  273 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from util import dictadd, boolify as bool_from_string
  6. import wx.lib.mixins.listctrl as wx
  7. from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin
  8. from wx import VERTICAL, HORIZONTAL, ALIGN_CENTER, TOP, BOTTOM, LEFT, RIGHT, EXPAND, ALL, ALIGN_CENTER, FONTWEIGHT_BOLD, WXK_DOWN
  9. from prefsdata import *
  10.  
  11. class PrefsViewer(wx.Panel):
  12.     columns = ('Preference Name', 'Status', 'Type', 'Value')
  13.     
  14.     def __init__(self, parent, prefs, defaults):
  15.         wx.Panel.__init__(self, parent, -1)
  16.         self.prefs = prefs
  17.         self.defaults = defaults
  18.         self.construct_gui()
  19.         prefs.add_observer(self.pref_changed)
  20.         parent.Bind(wx.EVT_CLOSE, self.on_frame_closed)
  21.         self.sort = (0, False)
  22.         self.on_filter_txt()
  23.         self.prefs_list.SetColumnWidth(0, -1)
  24.         if wx.Platform != '__WXMAC__':
  25.             offset = -10
  26.         else:
  27.             offset = -25
  28.         self.prefs_list.SetColumnWidth(0, self.prefs_list.GetColumnWidth(0) + offset)
  29.  
  30.     
  31.     def pref_changed(self, source, pref, old, new):
  32.         wx.CallAfter(self.on_filter_txt)
  33.  
  34.     
  35.     def on_frame_closed(self, e = None):
  36.         self.Hide()
  37.         self.prefs.remove_observer(self.pref_changed)
  38.         e.Skip(True)
  39.  
  40.     
  41.     def filtered_prefs(self, substr = ''):
  42.         sum = dictadd(self.defaults, self.prefs)
  43.         substr = substr.lower()
  44.         remove_these_keys = _[1]
  45.         for key in remove_these_keys:
  46.             sum.pop(key)
  47.         
  48.         return sum
  49.  
  50.     
  51.     def construct_gui(self):
  52.         self.filter_txt = wx.TextCtrl(self, -1)
  53.         [ self.filter_txt.Bind(e, m) for e, m in [
  54.             (wx.EVT_TEXT, self.on_filter_txt),
  55.             (wx.EVT_KEY_DOWN, self.on_filter_text_key)] ]
  56.         self.prefs_list = PrefsListCtrl(self)
  57.         for e, m in [
  58.             (wx.EVT_LIST_ITEM_ACTIVATED, self.on_dclick),
  59.             (wx.EVT_LIST_COL_CLICK, self.on_col_click),
  60.             (wx.EVT_RIGHT_UP, self.on_right_up),
  61.             (wx.EVT_RIGHT_DOWN, self.on_right_down)]:
  62.             self.prefs_list.Bind(e, m)
  63.         
  64.         for i in xrange(len(self.columns)):
  65.             self.prefs_list.InsertColumn(i, self.columns[i])
  66.         
  67.         self.show_all = wx.Button(self, -1, 'Sho&w All')
  68.         self.show_all.Bind((wx.EVT_BUTTON,), (lambda e: None if self.filter_txt.GetValue() != '' else None))
  69.         self.add_new = wx.Button(self, -1, '&Add')
  70.         self.add_new.Bind(wx.EVT_BUTTON, self.add_new_pref)
  71.         hbox = wx.BoxSizer(HORIZONTAL)
  72.         hbox.AddMany([
  73.             (wx.StaticText(self, -1, 'Filter:', style = ALIGN_CENTER), 0, TOP | LEFT | BOTTOM | ALIGN_CENTER, 8),
  74.             (self.filter_txt, 100, EXPAND | ALL, 8),
  75.             (self.show_all, 0, TOP | BOTTOM, 8),
  76.             (self.add_new, 0, TOP | BOTTOM | RIGHT, 8)])
  77.         vbox = wx.BoxSizer(VERTICAL)
  78.         vbox.AddMany([
  79.             (hbox, 0, EXPAND),
  80.             (self.prefs_list, 1, EXPAND)])
  81.         self.SetSizer(vbox)
  82.         
  83.         def foo(e):
  84.             print e
  85.  
  86.         self.Bind(wx.EVT_BUTTON, foo)
  87.  
  88.     
  89.     def add_new_pref(self, e):
  90.         key = str(wx.GetTextFromUser('Please enter the name for the pref', 'Add pref', self.filter_txt.Value))
  91.         if not key:
  92.             return None
  93.         
  94.         typ = str(wx.GetSingleChoice('Please choose the type for the pref', 'Add pref', nice_type_names.values()))
  95.         if not typ:
  96.             return None
  97.         
  98.         typ = nice_name_types[typ]
  99.         if typ is list:
  100.             edit_string_list = edit_string_list
  101.             import gui.toolbox
  102.             (ok, val) = edit_string_list(self, [
  103.                 typ()], 'Editing %s' % key)
  104.             if not ok:
  105.                 return None
  106.             
  107.         else:
  108.             val = str(wx.GetTextFromUser('Please enter the value for the pref', 'Add pref'))
  109.             val = None if typ is bool else typ(val)
  110.             if val == '':
  111.                 return None
  112.             
  113.         self.prefs[key] = val
  114.  
  115.     
  116.     def on_filter_txt(self, e = None):
  117.         self.update_list(self.filtered_prefs(self.filter_txt.Value))
  118.  
  119.     
  120.     def get_default_string(self, key):
  121.         
  122.         try:
  123.             val = self.prefs[key]
  124.         except KeyError:
  125.             return 'default'
  126.  
  127.         return None if val == self.defaults.get(key, sentinel) else 'user-set'
  128.  
  129.     
  130.     def update_list(self, prefs_dict, n = -1):
  131.         self.shown = []
  132.         append = self.shown.append
  133.         plist = self.prefs_list
  134.         sel = plist.GetFirstSelected()
  135.         getdefstr = self.get_default_string
  136.         plist.Frozen().__enter__()
  137.         
  138.         try:
  139.             plist.DeleteAllItems()
  140.             SetStringItem = plist.SetStringItem
  141.             for key, value in enumerate(prefs_dict.iteritems()):
  142.                 def_string = getdefstr(key)
  143.                 plist.InsertStringItem(i, key)
  144.                 SetStringItem(i, 1, def_string)
  145.                 SetStringItem(i, 2, nice_type_names[type(value)])
  146.                 SetStringItem(i, 3, str(value))
  147.                 plist.SetItemData(i, i)
  148.                 append((key, value))
  149.                 i += 1
  150.             
  151.             plist.SortItems(self.on_sort)
  152.             if sel != -1:
  153.                 plist.EnsureVisible(sel)
  154.         finally:
  155.             pass
  156.  
  157.  
  158.     
  159.     def on_filter_text_key(self, e):
  160.         if e.KeyCode == WXK_DOWN:
  161.             self.prefs_list.SetFocus()
  162.         else:
  163.             e.Skip(True)
  164.  
  165.     
  166.     def on_col_click(self, e):
  167.         c = e.GetColumn()
  168.         if c == self.sort[0]:
  169.             ascending = not self.sort[1]
  170.         else:
  171.             ascending = False
  172.         self.sort = (c, ascending)
  173.         self.prefs_list.SortItems(self.on_sort)
  174.  
  175.     
  176.     def on_sort(self, one, two):
  177.         one = self.shown[one]
  178.         two = self.shown[two]
  179.         (column, ascending) = self.sort
  180.         
  181.         ({
  182.             0: (lambda x: x[0]),
  183.             2: (lambda x: nice_type_names[type(x[1])]),
  184.             3: (lambda x: str(x[1])) },)[1] = lambda x: self.get_default_string(x[0])
  185.         _cmp = {
  186.             0: (lambda x: x[0]),
  187.             2: (lambda x: nice_type_names[type(x[1])]),
  188.             3: (lambda x: str(x[1])) }.get(column, None)
  189.         return ascending == _cmp(one) < _cmp(two)
  190.  
  191.     
  192.     def on_dclick(self, e):
  193.         key = e.GetText()
  194.         get = get
  195.         import util
  196.         mysentinel = Sentinel()
  197.         defval = get(self.defaults, key, mysentinel)
  198.         val = self.prefs.setdefault(key, defval)
  199.         if isinstance(defval, bool):
  200.             val = not val
  201.         elif isinstance(defval, list):
  202.             if is_all(val, (str, unicode))[0]:
  203.                 (ok, new_list) = edit_string_list(self, val, 'Editing ' + key)
  204.                 if ok:
  205.                     val = new_list
  206.                 
  207.             else:
  208.                 print is_all(val)
  209.                 raise AssertionError, key + ' is not a homogenous list :( tell Kevin to make this more gooder'
  210.         elif isinstance(defval, (str, unicode, int, float)) or defval is mysentinel:
  211.             t = None if defval is mysentinel else type(defval)
  212.             print 'editing pref of type', t
  213.             diag = wx.TextEntryDialog(self, key, 'Enter %s' % nice_type_names[t], str(val))
  214.             if diag.ShowModal() == wx.ID_OK:
  215.                 val = diag.GetValue()
  216.                 if t is bool:
  217.                     val = bool_from_string(val)
  218.                 
  219.                 if val == '':
  220.                     self.prefs[str(key)] = self.defaults[str(key)]
  221.                     return self.on_filter_txt()
  222.                 elif defval is not mysentinel:
  223.                     val = t(val)
  224.                 
  225.             
  226.         
  227.         self.prefs[str(key)] = val
  228.         self.on_filter_txt()
  229.  
  230.     
  231.     def on_right_up(self, e):
  232.         i = self.prefs_list.GetFirstSelected()
  233.  
  234.     
  235.     def on_right_down(self, e):
  236.         e.Skip(True)
  237.  
  238.  
  239.  
  240. class PrefsFrame(wx.Frame):
  241.     
  242.     def __init__(self, prefs, defaults, parent = None, id = -1, title = 'Advanced Preferences', name = 'Advanced Preferences'):
  243.         wx.Frame.__init__(self, parent, id, title, style = wx.DEFAULT_FRAME_STYLE | wx.FRAME_NO_TASKBAR & ~(wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX))
  244.         self.prefs_viewer = PrefsViewer(self, prefs, defaults)
  245.         persist_window_pos = persist_window_pos
  246.         snap_pref = snap_pref
  247.         import gui.toolbox
  248.         persist_window_pos(self, unique_id = 'PrefsFrame', defaultrect = (lambda : wx.Rect(100, 100, 600, 500)))
  249.         snap_pref(self)
  250.  
  251.  
  252.  
  253. class PrefsListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin):
  254.     list_style = wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_SINGLE_SEL
  255.     
  256.     def __init__(self, parent, id = -1, style = None):
  257.         if not style:
  258.             pass
  259.         wx.ListCtrl.__init__(self, parent, id, style = self.list_style)
  260.         ListCtrlAutoWidthMixin.__init__(self)
  261.  
  262.  
  263.  
  264. def edit(prefs, defaults, parent = None):
  265.     for win in wx.GetTopLevelWindows():
  266.         if isinstance(win, PrefsFrame):
  267.             return win.Close()
  268.             continue
  269.     
  270.     f = PrefsFrame(parent = parent, prefs = prefs, defaults = defaults)
  271.     wx.CallAfter(f.Show)
  272.  
  273.